home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Forever 4
/
Atari Forever 4.zip
/
Atari Forever 4.iso
/
SERIE_S
/
S_904
/
HALMA
/
HALMA.GFA
(
.txt
)
next >
Wrap
GFA-BASIC Atari
|
1998-03-14
|
22KB
|
868 lines
' Globale Fenstervariablen: hand,wx,wy,ww,wh,s_v
$m30000
a&=APPL_INIT()
' ON ERROR GOSUB err
window_install
'
'
DIM feld.spieler|(18,18) ! Welchem Spieler gehört der Stein ?
DIM feld.stein|(18,18) !Steinnr., für jeden Spieler von 0 bis 14
ARRAYFILL feld.stein|(),255
DIM feld!(20,20) ! Welche Punkte im 18*18 Feld gehören zum Spielfeld
spieler_anz|=2 ! Anzahl der Spieler (anderes geht auch nicht)
DIM figur.x|(spieler_anz|,15),figur.y|(spieler_anz|,15)
'
zug.maxanz|=200
max_tiefe|=7
' denktiefe|
DIM zug.x|(max_tiefe|,zug.maxanz|) !x-Zielfeld der mögl. Züge
DIM zug.y|(max_tiefe|,zug.maxanz|) !y-Zielfeld
DIM zug.stein|(max_tiefe|,zug.maxanz|) !steinnr mit dem auf x-,y-Zielfeld gezogen werden kann
'
DIM wert&(max_tiefe|,zug.maxanz|)
DIM wert.p&(max_tiefe|,zug.maxanz|)
DIM weiter_testen&(max_tiefe|)
'
DIM compi!(spieler_anz|)
'
'
dh|=21 !Abstände zw. Feldpunkten
dw|=24
bewerte.init
'
'
IF a&=0
prg!=TRUE
hand&=@openw
ELSE
menu&=MENU_REGISTER(a&," Halma")
WHILE menu&=-1 !zuviele einträge
~EVNT_MESAG(0)
WEND
ENDIF
'
~EVNT_MESAG(0) !Redraw,clipping
fenster
'
DO
IF hand&<>-1
haupt
ELSE
~EVNT_MESAG(0)
fenster
ENDIF
LOOP
'
> PROCEDURE haupt
REPEAT
ARRAYFILL feld!(),FALSE
eingabe !Wer gegen wen, denktiefe| einstellen
'
zugnr%=0 !für die Eröffnung
mache_feld
figuren_aufbau(spieler_anz|)
zeige_feld
'
'
game
print("Nochmal (j/n)")
UNTIL UPPER$(CHR$(INP(2)))<>"J"
RETURN
'
> PROCEDURE eingabe
LOCAL w|,a|
@print(" 0. Mensch - Mensch")
@print(" 1. Mensch - Computer")
@print(" 2. Computer - Mensch")
@print(" 3. Computer - Computer")
REPEAT
a|=ASC(@input$(" Wahl:",1))
UNTIL VAL?(CHR$(a|))
w|=VAL(CHR$(a|))
compi!(1)=w| AND 2
compi!(2)=w| AND 1
'
IF w|
print("")
print(" Computereinstellung")
print(" 1. Schwach")
print(" 2. Normal")
REPEAT
a|=ASC(@input$(" Wahl:",1))
UNTIL VAL?(CHR$(a|))
denktiefe|=VAL(CHR$(a|))-1
ENDIF
@cls
RETURN
' ---- Feldvariablen initialisieren ----
> PROCEDURE mache_feld
' Die Punkte in feld!(), die zum Spielfeld gehören, werden TRUE gesetzt
LOCAL i|,j|
ARRAYFILL feld!(),FALSE
FOR i|=0 TO 12
FOR j|=i| TO 12
feld!(i|+4+2,j|+2)=TRUE
NEXT j|
NEXT i|
FOR i|=0 TO 12
FOR j|=12-i| TO 12
feld!(i|+2,12-j|+4+2)=TRUE
NEXT j|
NEXT i|
RETURN
> PROCEDURE figuren_aufbau(spieler_anz|)
' Die Steine der Spieler werden auf das Feld gesetzt
LOCAL i|,j|,nr&
ARRAYFILL feld.spieler|(),0
ARRAYFILL feld.stein|(),255
ARRAYFILL figur.x|(),0
ARRAYFILL figur.y|(),0
FOR j|=0 TO 4
FOR i|=j| TO 4
feld.spieler|(8-i|,4-j|)=1
feld.stein|(8-i|,4-j|)=nr&
figur.x|(1,nr&)=8-i|
figur.y|(1,nr&)=4-j|
'
' if spieler_anz|=3 ...
feld.spieler|(8+i|,12+j|)=2
feld.stein|(8+i|,12+j|)=nr&
figur.x|(2,nr&)=8+i|
figur.y|(2,nr&)=12+j|
'
INC nr&
NEXT i|
NEXT j|
RETURN
'
' ---- Der Spielablauf und die Gewonnen-Kontrolle ------
> PROCEDURE game
LOCAL sieger|
REPEAT
FOR spieler|=1 TO spieler_anz|
IF compi!(spieler|)
~@denken(0,spieler|)
ELSE
spieler(spieler|)
ENDIF
sieger|=@gewonnen
EXIT IF INKEY$="E" OR sieger|
NEXT spieler|
EXIT IF INKEY$="E"
UNTIL sieger|
IF compi!(sieger|)
@print("Computer "+STR$(sieger|)+" hat gewonnen.")
ELSE
@print("Spieler "+STR$(sieger|)+" hat gewonnen.")
ENDIF
RETURN
> PROCEDURE ziehe(spieler|,von.x|,von.y|,nach.x|,nach.y|,zug!)
feld.spieler|(von.x|,von.y|)=0
feld.spieler|(nach.x|,nach.y|)=spieler|
figur.x|(spieler|,feld.stein|(von.x|,von.y|))=nach.x|
'
figur.y|(spieler|,feld.stein|(von.x|,von.y|))=nach.y|
'
feld.stein|(nach.x|,nach.y|)=feld.stein|(von.x|,von.y|)
'
feld.stein|(von.x|,von.y|)=255
'
IF zug!
zeichne_punkt(von.x|,von.y|,FALSE)
zeichne_punkt(nach.x|,nach.y|,FALSE)
ENDIF
RETURN
> FUNCTION gewonnen
LOCAL gewonnen.1!,gewonnen.2!,i|,j|
gewonnen.1!=TRUE
gewonnen.2!=TRUE
FOR j|=0 TO 4
FOR i|=j| TO 4
gewonnen.1!=gewonnen.1! AND feld.spieler|(8+i|,j|+12)=1
gewonnen.2!=gewonnen.2! AND feld.spieler|(8-i|,4-j|)=2
NEXT i|
NEXT j|
IF gewonnen.1!
RETURN 1
ELSE IF gewonnen.2!
RETURN 2
ENDIF
RETURN 0
ENDFUNC
'
' ---- Die Züge von einem Spieler -----
> PROCEDURE spieler(spieler|)
LOCAL moegl!,nr&,von.x|,von.y|,nach.x|,nach.y|
nr&=@suche_zuege(spieler|,0)
REPEAT
text&=0
@print(" Spieler "+STR$(spieler|)+" ist dran!")
moegl!=@zugeingabe(spieler|,nr&,von.x|,von.y|,nach.x|,nach.y|)
IF moegl!=0
OUT 2,7
text&=1
@print("Zug nicht möglich!")
~EVNT_TIMER(1500) ! 1.5s
text&=1
@print(" ")
ENDIF
UNTIL moegl!
text&=1
@print(" ")
ziehe(spieler|,von.x|,von.y|,nach.x|,nach.y|,1)
RETURN
> FUNCTION zugeingabe(spieler|,nr&,VAR von.x|,von.y|,nach.x|,nach.y|)
LOCAL mx&,my&,i&,maus|
' ---- Die Eingabe der von Start- und Zielpunkt ----
REPEAT
text&=1
@print(" von ")
REPEAT
maus|=@punkt(von.x|,von.y|)
UNTIL feld.spieler|(von.x|,von.y|)=spieler|
'
text&=1
@print(" nach")
maus|=@punkt(nach.x|,nach.y|)
UNTIL maus|=1
'
' ---- Kontrolle, ob der Zug erlaubt ist ----
i&=0
REPEAT
' steinkontrolle, wird der Richtige stein gezogen?
IF feld.stein|(von.x|,von.y|)=zug.stein|(0,i&)
IF zug.x|(0,i&)=nach.x| AND zug.y|(0,i&)=nach.y|
' PRINT "ok "
RETURN TRUE
ENDIF
ENDIF
INC i&
UNTIL i&=nr&
' PRINT "nok "
RETURN FALSE
ENDFUNC
> FUNCTION punkt(VAR x|,y|) !Eingabe von einem Feldpunkt
LOCAL x&,y&,mt&
LOCAL wx1&,wy1&,ww1&,wh1&
~WIND_GET(hand&,4,wx1&,wy1&,ww1&,wh1&)
'
mt&=@maus(x&,y&)
'
y|=MAX(-INT(y&-(wy1&+wh1&-8)-dh|/2)/dh|,0)
x|=MAX(INT((x&-(wx1&+ww1&/2))/dw|+(y|-7.5)/2+8),0) !7.5+0.5
'
RETURN mt&
ENDFUNC
'
' ---- Anzeigeroutinen -------------
> PROCEDURE zeige_feld
LOCAL i|,j|
LOCAL cx&,cy&
LOCAL wx1&,wy1&,ww1&,wh1&
'
IF feld!(10,10) !Aufbauen
~WIND_GET(hand&,4,wx1&,wy1&,ww1&,wh1&)
cx&=wx1&+ww1&/2
cy&=wy1&+wh1&-8
FOR i|=0 TO 12
LINE cx&-(i|-0.5)/2*dw|,cy&-16*dh|+i|*dh|,cx&+(i|+0.5)/2*dw|,cy&-16*dh|+i|*dh|
LINE cx&-(i|-0.5)/2*dw|,cy&-i|*dh|,cx&+(i|+0.5)/2*dw|,cy&-i|*dh|
LINE cx&+(i|-6)*dw|+dw|/4,cy&-12*dh|,cx&+i|/2*dw|+dw|/4,cy&-i|*dh|
LINE cx&+(i|-6)*dw|+dw|/4,cy&-12*dh|,cx&+i|/2*dw|+dw|/4,cy&-i|*dh|
LINE cx&-(i|-0.5)/2*dw|,cy&-16*dh|+i|*dh|,cx&-(i|-6.25)*dw|,cy&-4*dh|
LINE cx&+(i|-5.75)*dw|,cy&-4*dh|,cx&+(i|+0.5)/2*dw|,cy&-16*dh|+i|*dh|
LINE cx&-(i|-0.5)/2*dw|,cy&-i|*dh|,cx&-(i|-6.25)*dw|,cy&-12*dh|
NEXT i|
ENDIF
'
FOR j|=0 TO 16
FOR i|=0 TO 16
IF feld!(i|+2,j|+2)
zeichne_punkt(i|,j|,TRUE)
ENDIF
NEXT i|
NEXT j|
RETURN
> PROCEDURE zeichne_punkt(i|,j|,f!)
LOCAL wx1&,wy1&,ww1&,wh1&
~WIND_GET(hand&,4,wx1&,wy1&,ww1&,wh1&)
DEFFILL 1,0,0
IF f!=0
DEFFILL 1,0,0
PCIRCLE wx1&+ww1&/2+((i|-7.5)-(j|-7.5)/2)*dw|,wy1&+wh1&-8-j|*dh|,7
~EVNT_TIMER(150)
DEFFILL 1,1,1
PCIRCLE wx1&+ww1&/2+((i|-7.5)-(j|-7.5)/2)*dw|,wy1&+wh1&-8-j|*dh|,7
~EVNT_TIMER(150)
ENDIF
SELECT feld.spieler|(i|,j|)
CASE 1
DEFFILL 1,2,5
CASE 2
DEFFILL 1,2,8
DEFAULT
DEFFILL 1,0,0
ENDSELECT
PCIRCLE wx1&+ww1&/2+((i|-7.5)-(j|-7.5)/2)*dw|,wy1&+wh1&-8-j|*dh|,7
RETURN
> PROCEDURE line(x&,y&,x1&,y1&)
LOCAL wx1&,wy1&,ww1&,wh1&
'
IF x1&=>0 AND y1&=>0 AND x1&<17 AND y1&<17
IF feld!(x1&+2,y1&+2)
~WIND_GET(hand&,4,wx1&,wy1&,ww1&,wh1&)
DRAW wx1&+ww1&/2+((x&-7.5)-(y&-7.5)/2)*dw|,wy1&+wh1&-8-y&*dh|
DRAW TO wx1&+ww1&/2+((x1&-7.5)-(y1&-7.5)/2)*dw|,wy1&+wh1&-8-y1&*dh|
ENDIF
ENDIF
RETURN
'
' ---- mögliche Züge von spieler| suchen -----
> FUNCTION suche_zuege(spieler|,tiefe|)
' Rückgabe: Anz. der mögl. Züge
' in zug.x(spieler,i) und zug.y(spieler,i) werden die Zielfelder der Züge
' hineingeschrieben. zug.stein(spieler.i) enthält den Wert des Steines, der
' zieht.
LOCAL i|,x|,y|,nr&
'
FOR i|=0 TO 14
x|=figur.x|(spieler|,i|)
y|=figur.y|(spieler|,i|)
zuege_vom_stein(x|,y|,tiefe|,feld.stein|(x|,y|),FALSE,nr&)
NEXT i|
RETURN nr&
ENDFUNC
> PROCEDURE zuege_vom_stein(i|,j|,tiefe|,stein|,jumped!,VAR nr&)
' die Prozedur testet in jede Richtung, ob der Stein i j gezogen werden kann
' +. .+ ++ -. .- --
zug(i|,j|,tiefe|,stein|,jumped!,1,0,nr&)
zug(i|,j|,tiefe|,stein|,jumped!,0,1,nr&)
zug(i|,j|,tiefe|,stein|,jumped!,1,1,nr&)
zug(i|,j|,tiefe|,stein|,jumped!,-1,0,nr&)
zug(i|,j|,tiefe|,stein|,jumped!,0,-1,nr&)
zug(i|,j|,tiefe|,stein|,jumped!,-1,-1,nr&)
RETURN
> PROCEDURE zug(i&,j&,tiefe|,stein|,jumped!,iadd&,jadd&,VAR nr&)
'
' Wenn der Zug in iadd,jadd-Richtung auf dem Spielfeld landet
' Wenn das Feld auf der Postion frei ist
' Wenn der Stein noch nicht gesprungen ist
' Dieser Zug ist möglich
' sonst wenn ein Sprung in die Richtung noch im Feld liegt
' wenn das Feld, auf das der Sprung zielt, frei ist
' wenn der Stein noch nicht auf dieses Feld gesprungen ist
' Dieser Zug ist möglich
' es kann nur noch gesprungen werden (jumped=TRUE)
' kann der Stein nochmal springen? ->rekursiv
ADD i&,iadd&
ADD j&,jadd&
IF feld!(i&+2,j&+2)
IF feld.spieler|(i&,j&)=0
IF jumped!=FALSE
zug.x|(tiefe|,nr&)=i&
zug.y|(tiefe|,nr&)=j&
zug.stein|(tiefe|,nr&)=stein|
INC nr&
ENDIF
ELSE
ADD i&,iadd&
ADD j&,jadd&
IF feld!(i&+2,j&+2)
IF feld.spieler|(i&,j&)=0
IF @schon(i&,j&,tiefe|,stein|,nr&)=FALSE
zug.x|(tiefe|,nr&)=i&
zug.y|(tiefe|,nr&)=j&
zug.stein|(tiefe|,nr&)=stein|
INC nr&
zuege_vom_stein(i&,j&,tiefe|,stein|,TRUE,nr&)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN
> FUNCTION schon(i|,j|,tiefe|,stein|,nr&)
' gibt TRUE zurück, wenn stein| schon einmal auf i|,j| gestanden hat.
' die Funktion geht davon aus, daß alle mögl. Züge des Steins hinterein-
' ander stehen
LOCAL k&
k&=nr&
WHILE k&
DEC k&
IF zug.stein|(tiefe|,k&)=stein|
IF zug.x|(tiefe|,k&)=i|
IF zug.y|(tiefe|,k&)=j|
RETURN TRUE
ENDIF
ENDIF
ELSE
k&=0
ENDIF
WEND
RETURN FALSE
ENDFUNC
'
> FUNCTION denken(tiefe|,spieler|)
LOCAL i&,p.i&,max|
text&=0
@print(" Compi überlegt. ")
'
INC zugnr%
' IF zugnr%>3
weiter_testen&(0)=6
weiter_testen&(1)=22
weiter_testen&(2)=3
weiter_testen&(3)=5
max_tiefe|=denktiefe|
~@denk_mal(0,spieler|)
qsort(0,weiter_testen&(0)-1,0,wert&(),wert.p&())
'
'
IF zugnr%>4
i&=0 !wählt zufällig einen gleichguten zug aus
REPEAT
INC i&
UNTIL wert&(0,i&)<>wert&(0,i&-1) OR i&>=weiter_testen&(0)
p.i&=wert.p&(0,RANDOM(i&))
ELSE
IF spieler|=1
max|=0
FOR i&=0 TO 5
max|=MAX(max|,zug.y|(0,wert.p&(0,i&)))
NEXT i&
p.i&=-1
FOR i&=5 DOWNTO 0
IF max|=zug.y|(0,wert.p&(0,i&)) AND (p.i&=-1 OR RANDOM(2)=0)
p.i&=wert.p&(0,i&)
ENDIF
NEXT i&
ELSE
max|=16
FOR i&=0 TO 5
max|=MIN(max|,zug.y|(0,wert.p&(0,i&)))
NEXT i&
p.i&=-1
FOR i&=5 DOWNTO 0
IF max|=zug.y|(0,wert.p&(0,i&)) AND (p.i&=-1 OR RANDOM(2)=0)
p.i&=wert.p&(0,i&)
ENDIF
NEXT i&
ENDIF
ENDIF
'
ziehe(spieler|,figur.x|(spieler|,zug.stein|(0,p.i&)),figur.y|(spieler|,zug.stein|(0,p.i&)),zug.x|(0,p.i&),zug.y|(0,p.i&),1)
' ELSE
' ~@eroeffnung(spieler|,zugnr%)
' ENDIF
RETURN 0
ENDFUNC
> FUNCTION bewerte(tiefe|,spieler|)
LOCAL i&,nr&,wert.alt&,zugstein|,zugstein.alt|
' bewertet alle Züge, die spieler jetzt machen kann und sortiert sie
' Rückgabewert ist die Zahl der mögl. Züge
'
zugstein.alt|=16 !nicht vorhandener Wert
control
nr&=@suche_zuege(spieler|,tiefe|)
control
FOR i&=0 TO nr&-1
wert.p&(tiefe|,i&)=i&
zugstein|=zug.stein|(tiefe|,i&)
IF zugstein|<>zugstein.alt|
wert.alt&=@wert(spieler|,figur.x|(spieler|,zugstein|),figur.y|(spieler|,zugstein|))
zugstein.alt|=zugstein|
ENDIF
wert&(tiefe|,i&)=@wert(spieler|,zug.x|(tiefe|,i&),zug.y|(tiefe|,i&))-wert.alt&
NEXT i&
qsort(0,nr&-1,tiefe|,wert&(),wert.p&())
RETURN nr&
ENDFUNC
> FUNCTION denk_mal(tiefe|,spieler|)
LOCAL nr&,i&,j&,best&,best_tiefer&,fx|,fy|,p.i&
'
' ----- Bewertung der Züge noch onhe Gegenzug -----
nr&=@bewerte(tiefe|,spieler|)
'
' --- die bisher besten weiter_testen&() Züge ausführen ---
IF ODD(tiefe|)
best&=32767
ELSE
best&=-32768
ENDIF
IF tiefe|<max_tiefe|
i&=0
WHILE wert&(tiefe|,i&)>0
p.i&=wert.p&(tiefe|,i&)
fx|=figur.x|(spieler|,zug.stein|(tiefe|,p.i&))
fy|=figur.y|(spieler|,zug.stein|(tiefe|,p.i&))
ziehe(spieler|,fx|,fy|,zug.x|(tiefe|,p.i&),zug.y|(tiefe|,p.i&),0)
'
' --- Die beste Hälfte der Gegenzüge ausführen ---
best_tiefer&=@denk_mal(tiefe|+1,(spieler| MOD 2)+1)
'
ADD wert&(tiefe|,i&),best_tiefer&
IF ODD(tiefe|)
IF best&>wert&(tiefe|,i&)
best&=wert&(tiefe|,i&)
ENDIF
ELSE
IF best&<wert&(tiefe|,i&)
best&=wert&(tiefe|,i&)
ENDIF
ENDIF
ziehe(spieler|,zug.x|(tiefe|,p.i&),zug.y|(tiefe|,p.i&),fx|,fy|,0)
INC i&
WEND
weiter_testen&(tiefe|)=i&
ELSE !IF tiefe|=max_tiefe|
best&=-32768
i&=0
WHILE wert&(tiefe|,i&)>=0 !weiter_testen&(tiefe|)
IF best&<wert&(tiefe|,i&)
best&=wert&(tiefe|,i&)
ENDIF
INC i&
WEND
IF ODD(tiefe|)
MUL best&,-1
ENDIF
ENDIF
RETURN best&
'
' PRINT "==>";(TIMER-t%)/200/nr&;"s"
ENDFUNC
> FUNCTION wert(spieler|,x|,y|)
' hohe werte - gute züge
IF spieler|=1
RETURN wert|(x|,y|)
ELSE IF spieler|=2
RETURN wert|(16-x|,16-y|)
ENDIF
ENDFUNC
> PROCEDURE control
LOCAL rueck&,d&,taste&
rueck&=EVNT_MULTI(&X110001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,d&,d&,d&,d&,taste&,d&)
' f c m s 1 2 3 4 5 1 2 3 4 5 a c mx my mt ks
IF rueck& AND &X10000
fenster
ENDIF
IF rueck& AND 1
IF taste&=27
@closew(hand&)
ENDIF
ENDIF
RETURN
'
> PROCEDURE qsort(l&,r&,tiefe&,VAR feld&(),feldmitsort&())
LOCAL i&,j&,a&
i&=l&
j&=r&
a&=feld&(tiefe&,INT((i&+j&)/2))
REPEAT
WHILE feld&(tiefe&,i&)>a&
INC i&
WEND
WHILE a&>feld&(tiefe&,j&)
DEC j&
WEND
IF i&<=j&
SWAP feld&(tiefe&,i&),feld&(tiefe&,j&)
SWAP feldmitsort&(tiefe&,i&),feldmitsort&(tiefe&,j&)
INC i&
DEC j&
ENDIF
UNTIL i&>j&
IF l&<j&
@qsort(l&,j&,tiefe&,feld&(),feldmitsort&())
ENDIF
IF i&<r&
@qsort(i&,r&,tiefe&,feld&(),feldmitsort&())
ENDIF
RETURN
'
> PROCEDURE bewerte.init
DIM wert|(16,16)
LOCAL x|,y|,data|,k|
FOR k|=0 TO 2
FOR y|=0 TO 16
FOR x|=0 TO 16
READ data|
ADD wert|(x|,16-y|),data|
' PRINT AT(x|*3+1,y|+2);wert|(x|,16-y|)'
NEXT x|
' PRINT
NEXT y|
NEXT k|
'
' Bewertung durch Entfernung vom Ziel
DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0, 0, 0, 0
DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,160, 0, 0, 0, 0
DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,150,150,150, 0, 0, 0, 0
DATA 0, 0, 0, 0, 0, 0, 0, 0, 0,140,140,140,140, 0, 0, 0, 0
DATA 0, 0, 0, 0, 90,100,110,120,130,130,130,130,130,120,110,100, 90
DATA 0, 0, 0, 0, 90,100,110,120,120,120,120,120,120,110,100, 90, 0
DATA 0, 0, 0, 0, 90,100,110,110,110,110,110,110,110,100, 90, 0, 0
DATA 0, 0, 0, 0, 90,100,100,100,100,100,100,100,100, 90, 0, 0, 0
DATA 0, 0, 0, 0, 90, 90, 90, 90, 90, 90, 90, 90, 90, 0, 0, 0, 0
DATA 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0
DATA 0, 0, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 0, 0, 0, 0
DATA 0, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 0, 0, 0, 0
DATA 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, 0
DATA 0, 0, 0, 0, 40, 40, 40, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0
DATA 0, 0, 0, 0, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DATA 0, 0, 0, 0, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DATA 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
'
' Bewertung durch Zentrierung
DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,20, 0, 0, 0, 0
DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,19,19, 0, 0, 0, 0
DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,18,20,18, 0, 0, 0, 0
DATA 0, 0, 0, 0, 0, 0, 0, 0, 0,17,19,19,17, 0, 0, 0, 0
DATA 0, 0, 0, 0, 8,10,12,14,16,18,20,18,16,14,12,10, 8
DATA 0, 0, 0, 0, 9,11,13,15,17,19,19,17,15,13,11, 9, 0
DATA 0, 0, 0, 0,10,12,14,16,18,20,18,16,14,12,10, 0, 0
DATA 0, 0, 0, 0,11,13,15,17,19,19,17,15,13,11, 0, 0, 0
DATA 0, 0, 0, 0,12,14,16,18,20,18,16,14,12, 0, 0, 0, 0
DATA 0, 0, 0,11,13,15,17,19,19,17,15,13,11, 0, 0, 0, 0
DATA 0, 0,10,12,14,16,18,20,18,16,14,12,10, 0, 0, 0, 0
DATA 0, 9,11,13,15,17,19,19,17,15,13,11, 9, 0, 0, 0, 0
DATA 8,10,12,14,16,18,20,18,16,14,12,10, 8, 0, 0, 0, 0
DATA 0, 0, 0, 0,17,19,19,17, 0, 0, 0, 0, 0, 0, 0, 0, 0
DATA 0, 0, 0, 0,18,20,18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DATA 0, 0, 0, 0,19,19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DATA 0, 0, 0, 0,20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
'
' Bewertung zum Vorwärtskommen
DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,37, 0, 0, 0, 0
DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,37,37, 0, 0, 0, 0
DATA 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,37,37,37, 0, 0, 0, 0
DATA 0, 0, 0, 0, 0, 0, 0, 0, 0,37,36,36,37, 0, 0, 0, 0
DATA 0, 0, 0, 0,30,30,30,30,37,34,31,34,37,30,30,30,30
DATA 0, 0, 0, 0,30,30,30,30,30,30,30,30,30,30,30,30, 0
DATA 0, 0, 0, 0,30,30,30,30,30,30,30,30,30,30,30, 0, 0
DATA 0, 0, 0, 0,30,30,30,30,30,30,30,30,30,30, 0, 0, 0
DATA 0, 0, 0, 0,30,30,30,30,30,30,30,30,30, 0, 0, 0, 0
DATA 0, 0, 0,30,30,30,30,30,30,30,30,30,30, 0, 0, 0, 0
DATA 0, 0,30,30,30,30,30,30,30,30,30,30,30, 0, 0, 0, 0
DATA 0,30,30,30,30,30,30,30,30,30,30,30,30, 0, 0, 0, 0
DATA 30,30,30,30,30,30,30,30,30,30,30,30,30, 0, 0, 0, 0
DATA 0, 0, 0, 0,27,27,27,27, 0, 0, 0, 0, 0, 0, 0, 0, 0
DATA 0, 0, 0, 0,23,23,23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DATA 0, 0, 0, 0,17,17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DATA 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
RETURN
'
'
'
'
> PROCEDURE haupt2
~EVNT_MESAG(0)
fenster
RETURN
> PROCEDURE window_install
hand&=-1
wx&=0
wy&=19
ww&=380
wh&=380
line_anz&=(wh&-38)/16
x_aufl&=WORK_OUT(0)
y_aufl&=WORK_OUT(1)
text&=0
lines&=50
DIM t$(lines&)
RETURN
> FUNCTION openw
hand&=WIND_CREATE(&X1011,wx&,wy&,x_aufl&,y_aufl&)
' vslide,Pf-up,down,Size,,move,full,close,name
name$=" Halma "+CHR$(0) !titelw
~WIND_SET(hand&,2,CARD(SWAP(V:name$)),CARD(V:name$),0,0) !Titel
IF WIND_OPEN(hand&,wx&,wy&,ww&,wh&)=0
OUT 2,7
~WIND_DELETE(hand&)
hand&=-1
ENDIF
RETURN hand&
ENDFUNC
> PROCEDURE closew(VAR hand&)
LOCAL f|
IF hand&>-1
ALERT 1,"Wirklich beenden?",1,"Ja|Nein",f|
IF f|=1
~WIND_GET(hand&,5,wx&,wy&,ww&,wh&)
IF ww&>0 AND wh&>0
~WIND_CLOSE(hand&)
~WIND_DELETE(hand&)
IF prg!
END
ENDIF
ENDIF
hand&=-1
ENDIF
ENDIF
RETURN
> PROCEDURE fenster
LOCAL wx1&,wy1&,ww1&,wh1&
IF MENU(1)=40
IF hand&=-1
hand&=@openw
ELSE
~WIND_SET(hand&,10,0,0,0,0) !TOPW
ENDIF
ENDIF
' IF hand&=MENU(4), außer bei 41
SELECT MENU(1)
CASE 20 !REDRAW
DEFMOUSE 2
~WIND_GET(hand&,11,wx1&,wy1&,ww1&,wh1&)
REPEAT
IF RC_INTERSECT(MENU(5),MENU(6),MENU(7),MENU(8),wx1&,wy1&,ww1&,wh1&)
CLIP wx1&,wy1&,ww1&,wh1&
redraw
ENDIF
~WIND_GET(hand&,12,wx1&,wy1&,ww1&,wh1&)
UNTIL ww1&=0 OR wh1&=0
DEFMOUSE 0
CLIP wx&+1,wy&+19,ww&-1,wh&-20
CASE 21,29 !TOPW
~WIND_SET(hand&,10,0,0,0,0)
CASE 22,41 !CLOSEW
@closew(hand&)
CASE 28 !MOVEW
wx&=MENU(5) AND &H1 !in 4er Schritten
wy&=(MENU(6) AND &H1)+3
~WIND_SET(hand&,5,wx&,wy&,ww&,wh&)
CLIP wx&+1,wy&+19,ww&-1,wh&-20
ENDSELECT
RETURN
> PROCEDURE redraw
LOCAL i&
DEFFILL 0,0,0
PBOX wx&,wy&+19,wx&+ww&,wy&+wh&
zeige_feld
FOR i&=v_s& TO MIN(v_s&+line_anz&,lines&)
TEXT wx&,wy&+(i&-v_s&)*16+16,t$(i&)
NEXT i&
RETURN
'
> PROCEDURE cls
LOCAL i&
DEFFILL 0,0,0
PBOX wx&,wy&+19,wx&+ww&-19,wy&+wh&-19
FOR i&=0 TO lines&
t$(i&)=""
NEXT i&
text&=0
RETURN
> PROCEDURE print(t$)
LOCAL i&,fertig!
REPEAT
fertig!=TRUE
INC text&
IF text&>lines&
text&=lines&
FOR i&=2 TO lines&
SWAP t$(i&-1),t$(i&)
NEXT i&
ENDIF
t$(text&)=LEFT$(t$,76)
IF LEN(t$)>76
t$=RIGHT$(t$,LEN(t$)-76)
fertig!=FALSE
ENDIF
IF v_s&+line_anz&<text&
v_s&=MAX(text&-line_anz&,0)
redraw
ELSE
TEXT wx&,wy&+text&*16+16,t$(text&)
ENDIF
UNTIL fertig!
RETURN
> FUNCTION key
LOCAL rueck&
REPEAT
rueck&=EVNT_MULTI(&X10001,0,0,0,0,0,0,0,0,0,0,0,0,0,a&,0,d&,d&,d&,d&,taste&,d&)
IF rueck& AND 10000
fenster
ENDIF
UNTIL rueck& AND 1
RETURN taste&
ENDFUNC
> FUNCTION maus(VAR mx&,my&)
LOCAL rueck&,d&
' Fenster,Maus,Tastatur
~EVNT_BUTTON(1,3,0) !keine linke Taste
REPEAT
rueck&=EVNT_MULTI(&X110000,1,3,1,0,0,0,0,0,0,0,0,0,0,0,10,mx&,my&,mt&,d&,d&,d&)
mt&=GINTOUT(3)
control
IF rueck& AND 10000
fenster
ENDIF
UNTIL mt&>0
RETURN mt&
ENDFUNC
> FUNCTION input$(t$,len&)
LOCAL rueck&,ret$,asc|,scan|
print(t$+"_")
REPEAT
rueck&=EVNT_MULTI(&X10001,0,0,0,0,0,0,0,0,0,0,0,0,0,a&,0,d&,d&,d&,d&,taste&,d&)
' ^adr.buf(MENU())
IF rueck& AND 1 !tastatur
asc|=taste& AND 255
scan|=(taste& DIV 256) AND 255
SELECT asc|
CASE 8
IF LEN(ret$)
ret$=LEFT$(ret$,LEN(ret$)-1)
ENDIF
CASE 32 TO 255
IF LEN(ret$)<len&
ret$=ret$+CHR$(asc|)
ENDIF
ENDSELECT
DEC text&
print(t$+ret$+"_ ")
ENDIF
IF rueck& AND &X10000
fenster
ENDIF
UNTIL asc|=13
RETURN ret$
ENDFUNC
> PROCEDURE err
t%=TIMER
REPEAT
OUT 2,7
UNTIL TIMER-t%>40
PRINT ERR
IF prg!
END
ELSE
DO
ON MENU 100
LOOP
ENDIF
RETURN
'
'
' 16 . ~
' 15 . . ~
' 14 . . . ~
' 13 . . . . ~
' 12 . . . . . . . . . . . . . ~
' 11 . . . . . . . . . . . . ~
' 10 . . . . . . . . . . . ~
' 9 . . . . . . . . . . ~
' 8 . . . . . . . . . ~
' 7 . . . . . . . . . . ~
' 6 . . . . . . . . . . . ~
' 5 . . . . . . . . . . . . ~
' 4 . . . . . . . . . . . . . ~
' 3 . . . . ~
' 2 . . . ~
' 1 . . ~
' 0 . ~
' + ~
' 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16